//#region 生成随机字符
export const random = () => Math.random().toString(36).substr(2)

export const randomString = len => {
  len = len || 32
  let t = '0123456789abcdefghijklmnopqrstuvwxyz', //ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    l = t.length,
    r = ''
  for (let i = 0; i < len; i++) r += t.charAt(Math.floor(Math.random() * l))
  return r
}
//#endregion

//#region 防抖
/**
 * 概念：触发事件后在N秒内函数只执行一次，若在N秒内再次触发则重新计算。如下拉触底加载下一页
 * @param {*} func 执行函数
 * @param {*} wait 延迟执行时间（单位毫秒）
 */
export function debounce(func, wait = 300) {
  let timeout //定时器
  return function () {
    if (timeout) clearTimeout(timeout) //取消之前的任务
    timeout = setTimeout(() => {
      func.apply(this, arguments) //执行func函数
    }, wait)
  }
}
//先立即查询，过wait后才能再查询（立即执行）
export function debounces(func, wait = 300) {
  let timeout //定时器
  return function () {
    if (timeout) clearTimeout(timeout) //取消之前的任务
    let callNow = !timeout
    timeout = setTimeout(() => {
      timeout = null //清空当前定时器
    }, wait)
    if (callNow) func.apply(this, arguments) //执行func函数
  }
}
//#endregion

//#region 节流
/**
 * 概念：节省流量，连续发生的事件在N秒内只执行一次函数，如搜索即时查询，固定时间执行
 * @param {*} func 执行函数
 * @param {*} wait 延迟执行时间（单位毫秒）
 */
export function throttle(func, wait = 300) {
  let prev = 0 //记录上次的时间
  return function () {
    let now = Date.now() //当前时间
    if (now - prev > wait) {
      func.apply(this) //执行函数
      prev = now //重置上次的时间
    }
  }
}
//#endregion
